package DigitalNetwork;

import java.util.ArrayList;
import java.util.Arrays;

/** 
 * Jelforras, mely belso mintaja szerint valtoztatja a kimenetet.
 * <p>
 *
 * </p>
 *
 * @author Ableda Peter
 * @author Andrasi Istvan
 * @author Kamaras Karoly
 * @author Pora Szilard
 *
 * @version 1.0 Build 2011.04.17.
 */
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
public class Generator extends Source {

	/** A betoltott minta. */
	private boolean[] pattern;
	/** Aktualis pozicio a mintaban. */
	private int pos;

	/** [Konstruktor]
	 * Letrehozza az outputs listat es egy 2 elemu mintat.
	 *
	 * @param _ID
     * @param x Az elem poziciojanak vizszintes komponense.
     * @param y Az elem poziciojanak fuggoleges komponense.
	 */
	//==========================================================================
	public Generator(String _ID, int x, int y) {
		super(x,y);
        // Beallitjuk az ID-t.
		this.ID = _ID;

		// Letrehozzuk a kimeneti portok listajat.
		this.outputs = new ArrayList<PortOut>();
		// Letrehozzuk a kimenetet.
		this.outputs.add(new PortOut(this.ID + "_o1", this));

		// Inicializaljuk a mintat.
		// Kezdoerteknek felveszunk egy [1,0] mintat.
		this.pattern = new boolean[2];
		this.pattern[0] = true;
		this.pattern[1] = false;
		this.pos = 0;

		// Ertesitunk.
		Main.printMessage("#" + this.getID() + " Generator letrehozva");
	}
	//==========================================================================

	/**
     * Vissza adja az elem tipusat.
	 *
	 * @return String Az elem tipusa.
	 */
	@Override
	//==========================================================================
	public String getType() {
		return "Generator";
	}
	//==========================================================================

	/**
     * Vissza adja az elem ID-jet es a minta sorok kovetkezo allapotat.
	 * 
	 * @return String
	 */
	@Override
	//==========================================================================
	public String print() {
		// A mintat a megfelelo formaba alakitjuk.
		int[] output = new int[this.pattern.length];
		for (int i = 0; i < this.pattern.length; i++) {
			output[i] = (this.pattern[i]) ? 1 : 0;
		}
		
		return "#" + this.ID + " Generator - "
			+ Arrays.toString(output) + " : " + this.pos;
	}
	//==========================================================================

    /**
     * Vissza adja az elem jelsorozatat.
	 *
	 * @return String
	 */
	//==========================================================================
	public String getPattern() {
		String output = new String();
		for (int i = 0; i < this.pattern.length; i++) {
			output += (this.pattern[i]) ? "1" : "0";
		}

		return output;
	}
	//==========================================================================

	/**
	 * Frissiti a kimenetet a minta soron kovetkezo elemenek ertekevel.
	 *
	 */
	@Override
	//==========================================================================
	public void updateOutput() {
		// Leptetjuk a poziciot.
		this.pos = (this.pos + 1) % this.pattern.length;
		// Frissiti a kimenetet a minta aktualis ertekevel.
		this.outputs.get(0).setState(this.pattern[this.pos]);
	}
	//==========================================================================

	/**
	 * Betolti a p mintat.
	 *
	 * @param p Betolteni kivant minta.
	 */
	//==========================================================================
	public void setPattern(boolean[] p) {
		// Eltaroljuk az uj tombot.
		this.pattern = new boolean[p.length];
		System.arraycopy(p, 0, this.pattern, 0, p.length);
        this.pos = 0;
	}
	//==========================================================================

    /**
     * Vissza adja a minta soron kovetkezo allapotat.
	 *
	 * @return String
	 */
	//==========================================================================
	public boolean getIsHigh() {
		return this.pattern[this.pos];
	}
	//==========================================================================
}
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

